﻿using System;
using System.Threading.Tasks;

namespace Aa开始
{

    internal class Guide
    {
        private string name;

        public Guide()
        {
            Task.Delay(new TimeSpan(0, 0, 3)).Wait();
        }

        private static void WaitAndSpeak(
            string message)
        {
            var pre = message.Length * 200;
            if (pre > 3000)
                pre = 3000;
            Task.Delay(
                new TimeSpan(0, 0, 0, 0, pre)).Wait();
            Console.ForegroundColor = ConsoleColor.DarkCyan;
            Console.WriteLine($"向导：{message}");
        }
        private static string ListenAndCheckValue(
            Func<string, bool> checker = null)
        {
            string input;
            do
            {
                Console.ForegroundColor = ConsoleColor.DarkMagenta;
                Console.Write("我：");
                input = Console.ReadLine();
            } while (!checker(input));
            return input;
        }

        internal void Introduce()
        {
            WaitAndSpeak("你好，我是 LearningCSharpThroughCodes 世界的向导。");
            this.AskTheName();
            this.IntroduceTheRepository();
            this.IntroduceLearningDetails();
        }
        private void AskTheName()
        {
            WaitAndSpeak("我应该叫您什么好呢？请输入您的称呼，然后按下回车：");

            this.name = ListenAndCheckValue((input) =>
            {
                if (input.Length == 0)
                {
                    WaitAndSpeak("你怎么不说话呀？你叫什么名字呢？");
                    return false;
                }
                return true;
            });
            WaitAndSpeak(this.name.Length > 6
                ? "好长的名字呢！不过你完全不用担心我会记不住。"
                : "一个好听又好记的名字！");
            WaitAndSpeak($"你好，{this.name}。让我们正式认识一下！");
        }

        private void IntroduceTheRepository()
        {
            WaitAndSpeak($"{this.name}？你是为什么来了这个世界呢？");
            WaitAndSpeak(ListenAndCheckValue((input) => true).Length == 0
                ? "不愿意说吗？也没关系。"
                : "这样啊。");
            WaitAndSpeak("在你之前也有很多人来到这个世界。");
            WaitAndSpeak("他们大多是为了学习 C# 而来。");
            WaitAndSpeak("听说在这个世界里他们可以学到很多。");
        }
        private void IntroduceLearningDetails()
        {
            WaitAndSpeak($"你也想学习 C# 吧，{this.name}。");
            ListenAndCheckValue((input) => true);
            WaitAndSpeak("听说你们这些外来人都会感到饥饿。");
            WaitAndSpeak("先吃块饼干吧，我们慢慢说。");
            WaitAndSpeak("在你来到这里之前，已经尝试过了这些内容吧：");
            WaitAndSpeak("1、使用 Visual Studio 打开解决方案“A开始”。");
            WaitAndSpeak("2、找到了项目“Aa开始”。");
            WaitAndSpeak("3、运行了项目“Aa开始”。");
            ListenAndCheckValue((input) => true);
            WaitAndSpeak("我想……");
            WaitAndSpeak("你能见到我就是最好的证明。");
            WaitAndSpeak("如果你不是完全靠自己来到的这里……");
            WaitAndSpeak("请一定一定要自己再试一次哦。");
            ListenAndCheckValue((input) => true);
            this.IntroduceSolutionsAndProjects();
            this.IntroduceComments();
            this.IntroduceEnglish();
            this.IntroduceNext();
            WaitAndSpeak("接下来我也没什么可介绍的了。");
            WaitAndSpeak("我的存在时间也差不多到了，你要继续前进呀。");
            WaitAndSpeak("不用担心，下次运行，我仍然会出现。");
            WaitAndSpeak("你还有什么想和我说吗？");
            ListenAndCheckValue((input) => true);
        }
        private void IntroduceSolutionsAndProjects()
        {
            WaitAndSpeak($"我说……可不要因此沾沾自喜呀，{this.name}同学。");
            WaitAndSpeak("在能够打开的基础上，你还得学着自己创建一个项目。");
            WaitAndSpeak("用 Visual Studio 创建项目是十分简单的。");
            WaitAndSpeak("先打开一个新的 Visual Studio 窗体吧。");
            WaitAndSpeak("开好了告诉我一声。");
            ListenAndCheckValue((input) => true);
            WaitAndSpeak($"好，那我继续说。");
            WaitAndSpeak("点击“创建新项目”。");
            ListenAndCheckValue((input) => true);
            WaitAndSpeak("然后选择一个模板，就控制台应用吧，别的类型以后会用到。");
            ListenAndCheckValue((input) => true);
            WaitAndSpeak("根据提示一步步向下走，你就成功了。");
            ListenAndCheckValue((input) => true);
            WaitAndSpeak("可一定要注意，在学习 C# 的过程中……");
            WaitAndSpeak("也要自己去创建项目，进行模仿哦！");
            ListenAndCheckValue((input) => true);
        }
        private void IntroduceComments()
        {
            WaitAndSpeak("然后我先给你介绍一下刚刚你看到的。");
            WaitAndSpeak("就是那一堆绿色的文字。");
            WaitAndSpeak("它们被 /* */ 包围起来，是一种注释的方式。");
            WaitAndSpeak("使用 // 也可以进行注释。");
            WaitAndSpeak($"你在听么，{this.name}？");
            WaitAndSpeak("你不如也试一下吧，就在你刚刚创建的项目里。");
            ListenAndCheckValue((input) => true);
            WaitAndSpeak("注释的内容不会被编译器访问到。");
            WaitAndSpeak("就好像他们不在这个代码文件里一样。");
            WaitAndSpeak("额，除了文档注释……");
            WaitAndSpeak("文档注释可以被解释成文档，这个我们以后再说。");
            ListenAndCheckValue((input) => true);
            WaitAndSpeak("注释可以帮助你理解代码。");
            WaitAndSpeak("在这个世界中是十分重要的。");
            ListenAndCheckValue((input) => true);
        }
        private void IntroduceEnglish()
        {
            WaitAndSpeak("接下来说说英语的问题吧。");
            WaitAndSpeak($"话说你有学过英语吗，{this.name}？");
            WaitAndSpeak("如果没有学过英语的话，会稍微碰到一些障碍。");
            WaitAndSpeak("毕竟基本上大家都会去用英语。");
            WaitAndSpeak("甚至包括这个世界，也是一样。");
            WaitAndSpeak("不过这里的注释通常是中文的。");
            WaitAndSpeak("其实问题不大，甚至还可以从这里掌握一些新单词。");
            WaitAndSpeak($"{this.name}？你有在听么？");
            ListenAndCheckValue((input) => true);
            WaitAndSpeak("好吧，你挺长时间没给我回应了。");
            WaitAndSpeak("我打算说说别的了。");
        }
        private void IntroduceNext()
        {
            WaitAndSpeak("就说说接下来你该怎么用这个仓库吧。");
            WaitAndSpeak("一个解决方案可以包含很多项目。");
            WaitAndSpeak("这个世界的建造者利用了这一点。");
            WaitAndSpeak("一个解决方案，意味着一个大部分，用大写字母表示。");
            WaitAndSpeak("而每个部分中都有若干项目，用小写字母表示。");
            WaitAndSpeak("每个项目都会用到某种新的东西……");
            WaitAndSpeak("你就可以通过阅览代码来学习了。");
            WaitAndSpeak($"{this.name}？你有在听吗？");
            ListenAndCheckValue((input) => true);
            WaitAndSpeak("差点以为你睡着了。");
            WaitAndSpeak("因为很多人都会在这时候睡着。");
            WaitAndSpeak("然后……你还得注意一下……");
            WaitAndSpeak("一个解决方案下，如果有多个项目……");
            WaitAndSpeak("你可以通过右键这个项目……");
            WaitAndSpeak("在 Visual Studio 的解决方案资源管理器右键哦！");
            WaitAndSpeak("右键这个项目……");
            WaitAndSpeak("然后点击“设为启动项目”。");
            WaitAndSpeak("……");
            WaitAndSpeak("你看起来好困啊，不如去打开解决方案“B基础语法”试试吧……");
            ListenAndCheckValue((input) => true);
            WaitAndSpeak("完成了？不错嘛。");
        }
    }
}
